perm filename FSTDAC.MAC[2,LCS] blob
sn#155837 filedate 1975-04-18 generic text, type T, neo UTF8
00100 NUM=↑D64 ;NUMBER OF 128 WORD BLOCKS PER BUFFER
00200 TITLE FSTDAC ;NICHOLAS VITULLI COLGATE U. 1973
00300 EXTERN FNAM,FILBRK ;ROUTINE TO GET INPUT FILE
00400 INTERN DEV ;NAME (DAVID HOFFMAN COLGATE)
00500 SIZE=200*NUM ;TOTAL SIZE OF EACH BUFFER
00600 STATUS=004000 ;INTERRUPTS ON
00700 OFF=0 ;STATUS BITS FOR DAC
00800 DONE=10
00900 BUSY=20
01000 MISS=40
01100 T=1 ;TEMP ACC
01200 I=2 ;ACC TO HOLD RELOCATION FACTOR
01300 SETUP=4 ;ACC USED FOR INITIAL SETUP
01400 DSK=5 ;INPUT CHANNEL
01500 B1=11 ;RELOCATED IOWD FOR BUFFER 1
01600 B2=12 ;RELOCATED IOWD FOR BUFFER 2
01700 IB1=13 ;IOWD FOR BUFFER 1
01800 IB2=14 ;IOWD FOR BUFFER 2
01900 IO=7 ;ACC FOR TTY INPUT
02000 INDEX: 0 ;SAVE RELOCATION FACTOR
02100 SAVET: 0 ;SAVE ACC T DURING INTERRUPT ROUTINE
02200 MFLG: 0 ;FLAG FOR DATA MISSED
02300 DFLG: 0 ;FLAG FOR DONE
02400 TPOINT: 0 ;NEXT IOWD FOR INTERRUPT ROUTINE
02500 WHATBF: 0 ;BUFFER POINTER 0=BUFFER 2 -1=BUFFER 1
02600 INTBLK: 4,INTLOC ;↑C BLOCK
02700 2
02800 0
02900 0
03000 ADD1: 0 ;INTERRUPT ROUTINE
03100 EXCHWD: EXCH I,INDEX ;GET RELOCATION FACTOR AND SAVE I
03200 MOVEM T,SAVET(I) ;SAVE T
03300 SETCMM WHATBF(I) ;POINT WHATBF TO NEXT BUFFER
03400 SKIPN T,TPOINT(I) ;GET NEXT IOWD (RELOCATED)
03500 JRST NODATA(I) ;IF 0 NO IOWD READY
03600 SETZM TPOINT(I) ;ZERO IOWD
03700 MOVEM T,POINTR(I) ;RESTORE BLKO POINTER
03800 RETURN: MOVE T,SAVET(I) ;RESTORE T
03900 EXCH I,INDEX(I) ;RESTORE I AND INDEX
04000 JENWD: JRSTF @ADD1 ;DISMISS INTERRUPT
04100 NODATA: CONSZ 200,MISS ;CHECK FOR DATA MISSED
04200 SETOM MFLG(I) ;YES RAISE MISSED FLAG
04300 CONO 200,OFF ;TURN OFF DAC
04400 SETOM DFLG(I) ;RAISE DONE FLAG
04500 JRST RETURN(I) ;RESTORE AND DISMISS
04600 ADD2: 0 ;APR TRAP (ASSUME NEVER TO GET HERE)
04700 BP1: BLOCK 2 ;IOWD FOR BF1
04800 BP2: BLOCK 2 ;IOWD FOR BF2
04900 POINTR: BLOCK 2 ;IOWD FOR BLKO
05000 RTB: XWD 1,ADD1 ;RTBLK UUO SETUP TO GET ON PI 1.
05100 XWD 1,ADD2 ;FSTBLK MODE
05200 CONSO 200,DONE
05300 BLKO 200,POINTR
05400 0
05500 RTBOFF: BLOCK 4 ;RTBLK UUO SETUP TO GET OFF PI
05600 BF1: BLOCK SIZE ;I/O BUFFER FOR SAMPLES
05700 BF2: BLOCK SIZE ;I/O BUFFER FOR SAMPLES
05800 STRT: RESET
05900 MOVE SETUP,[EXIT] ;DON'T ALLOW RESTART
06000 MOVEM SETUP,STRT
06100 RETRY2: JSA 16,FILBRK ;GET INPUT FILE NAME
06200 INIT DSK,17 ;DUMP MODE INPUT
06300 DEV: 0 ;DEV FILLED BY FILBRK
06400 0
06500 JRST [
06600 OUTSTR [ASCIZ /CAN'T GET INPUT DEVICE?/]
06700 EXIT] ;EXIT ON DEVICE ERROR
06800 SKIPE FNAM ;IF FILE NAME BLANK
06900 JRST LKUP ;SET FILE NAME
07000 MOVE SETUP,['MUSIC '] ;TO MUSIC.MUS
07100 MOVEM SETUP,FNAM
07200 MOVSI SETUP,'MUS'
07300 MOVEM SETUP,FNAM+1
07400 LKUP: LOOKUP DSK,FNAM ;STORAGE FOR FNAME IN FILBRK
07500 JRST [
07600 OUTSTR [ASCIZ /?CAN'T FIND?/]
07700 JRST RETRY2] ;GET NEW NAME ON LOOKUP ERROR
07800 OUTSTR [ASCIZ /MODE? /] ;GET MODE FOR DAC OUTPUT
07900 INCHWL IO ;PUT IN BITS 18+19 OF CONOWD
08000 SUBI IO,60
08100 DPB IO,[POINT 2,CONOWD,19]
08200 CLRBFI ;NO TYPE AHEAD
08300 OUTSTR [ASCIZ /CLOCK? /] ;GET CLOCK RATE
08400 INCHWL IO ;GET SELECT
08500 SUBI IO,60 ;PUT IN BITS 28+29
08600 DPB IO,[POINT 2,CONOWD,29]
08700 INCHWL IO ;GET DIVIDE
08800 SUBI IO,60 ;PUT IN BITS 20,21+22
08900 DPB IO,[POINT 3,CONOWD,22]
09000 CLRBFI
09100 RETRY1: MOVE SETUP,[XWD 1,1] ;LOCK IN CORE
09200 LOCK SETUP, ;ON ANY ERROR TYPE 'L'
09300 JRST [
09400 OUTSTR [ASCIZ /L/]
09500 INCHRS IO
09600 JRST RETRY1
09700 EXIT] ;TRY TO LOCK AGAIN, EXIT FROM RETRY LOOP ON TTY INPUT.
09800 OUTSTR [ASCIZ /
09900 /]
10000 HRRZ SETUP,SETUP ;GET RELOCATION FROM
10100 LSH SETUP,9 ;LOCK UUO (NORMALIZE)
10200 MOVEM SETUP,INDEX ;STORE IN INDEX
10300 ADDM SETUP,EXCHWD ;RELOCATE SOME INSTRUCTIONS
10400 ADDM SETUP,JENWD
10500 MOVE IB1,[IOWD SIZE,BF1] ;CREATE IOWD'S IN ACCS
10600 MOVE IB2,[IOWD SIZE,BF2] ;FOR QUIT RESTORE
10700 MOVEM IB1,BP1 ;SET UP IOWD FOR FIRST READ
10800 MOVEM IB1,POINTR ;CREATE IOWD FOR BLKO
10900 MOVEI SETUP,INTBLK ;GRAB ↑C
11000 MOVEM SETUP,134
11100 MOVEI SETUP,RTB ;EXECUTE RTBLK UUO
11200 RTTRP SETUP,
11300 JRST [
11400 OUTSTR [ASCIZ /?NCH?/]
11500 EXIT] ;EXIT ON ERROR
11600 MOVE B1,POINTR ;GET RELOCATE IOWD FOR BUF1
11700 HRRZ B2,POINTR ;MODIFY FOR BUF2
11800 ADDI B2,SIZE
11900 HLL B2,POINTR
12000 SETZM MFLG ;LOWER MISSED FLAG
12100 SETZM DFLG ;LOWER DONE FLAG
12200 SETZM TPOINT ;ZERO NEXT IOWD
12300 SETZM WHATBF ;POINT WHATBF TO BUFFER 2
12400 MOVEI SETUP,1 ;GET IN HPQ 1
12500 HPQ SETUP, ;(HIGHER THAN NORMAL TIME SHARING)
12600 JRST [
12700 OUTSTR [ASCIZ /?CAN'T HPQ?
12800 /]
12900 JRST XIT+1] ;EXIT GRACEFULLY ON ERROR
13000 IN DSK,BP1 ;FILL FIRST BUFFER FROM DSK
13100 SKIPA
13200 JRST XIT ;ASSUME NULL FILE
13300 CONSZ 200,BUSY ;IS DAC ALREADY ON
13400 OUTSTR [ASCIZ /?DAC IS ON?
13500 /] ;YES TELL USER
13600 CONOWD: CONO 200,STATUS ;START DAC
13700 LOOP:
13800 SKIPE DFLG ;IF DONE FLAG IS RAISED HERE - ERROR
13900 JRST MISSED ;NEXT IOWD WAS NOT READY
14000 SKIPE WHATBF ;WAIT FOR PERMISSION TO FILL BUFFER 2
14100 JRST LOOP
14200 MOVEM IB2,BP2 ;RESTORE INPUT IOWD (NECESSARY FOR MTA)
14300 IN DSK,BP2 ;READ BUFFER
14400 SKIPA
14500 JRST X1 ;AT EOF WAIT FOR DONE FLAG
14600 MOVEM B2,TPOINT ;RESTORE NEXT IOWD
14700 LOOP1: SKIPE DFLG ;SAME AS ABOVE BUT FOR BUFFER 1
14800 JRST MISSED
14900 SKIPL WHATBF
15000 JRST LOOP1
15100 MOVEM IB1,BP1
15200 IN DSK,BP1
15300 SKIPA
15400 JRST X1
15500 MOVEM B1,TPOINT
15600 JRST LOOP
15700 MISSED: OUTSTR [ASCIZ /
15800 ?COULD NOT READ INPUT FAST ENOUGH?
15900 /] ;NO NEXT POINTER, THE DONE FLAG WAS RAISED BUT MORE SAMPLES EXISTED.
16000 X1: SKIPL DFLG ;WAIT FOR DONE FLAG -- ALL SAMPLES READ
16100 JRST .-1
16200 SKIPE MFLG ;WAS DATA MISSED (SET IN INTERRUPT ROUTINE)
16300 OUTSTR [ASCIZ /?DATA MISSED?
16400 /] ;YES -- TELL USER
16500 SKIPA
16600 XIT: OUTSTR [ASCIZ /?NULL FILE?/] ;TELL USER EOF ON FIRST READ
16700 MOVEI SETUP,RTBOFF ;GET OFF PI
16800 RTTRP SETUP,
16900 JFCL ;IGNORE ANY ERROR
17000 MOVE SETUP,[XWD 1,1] ;UNLOCK
17100 UNLOK. SETUP,
17200 JFCL ;IGNORE ANY ERRORS
17300 MOVEI SETUP,0
17400 HPQ SETUP, ;GET BACK TO TIMESHARING LEVEL
17500 JFCL ;IGNORE ANY ERRORS
17600 EXIT ;SAY HELLO TO MONITOR
17700 INTLOC: CONO 200,OFF ;HERE ON ↑C -- TURN OF DEVICE
17800 JRST XIT+1 ;EXIT GRACEFULLY
17900 END STRT